package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomLogin;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.AdsException;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.adsrt.lib.Form;
import br.com.telescope.sql.ModelQuery;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.feature.DeleteFeature;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.t2.feature.LookupFeature;
import br.com.telescope.t2.feature.MultiRowInsertFeature;
import br.com.telescope.t2.feature.MultiRowUpdateFeature;
import br.com.telescope.t2.feature.ViewFeature;
import br.com.telescope.util.ObjectUtil;
import java.util.ArrayList;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Operadores dos instrumentos.
 * <p>
 * Interface para manutenção de Operador do instrumento
 * <P>
 * Telescope origin: ZTEST.CAD_OPERADOR_INSTRUMENTO
 * <P>
 * Base entity: ZTEST.OPERADOR_INSTRUMENTO
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class CadOperadorInstrumento extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "ZTEST.CAD_OPERADOR_INSTRUMENTO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Operadores dos instrumentos");
    }
    
    protected EntOperadorInstrumento base;
    protected EntPessoa oper;
    protected EntUsuarios usua;
    protected EntOperadorInstrumento rec; // NEED_TJW1_COMPATIBILITY
    
    // Service parameters
    private DomId pIdInstrumentoEnsaio;
    
    // Record items
    private DomId aId;
    private DomId aInstrumentoEnsaioId;
    private DomId aOperadorInstrumentoId;
    private DomUpper aNomeApresentacao;
    private DomUpper aOperNome;
    private DomUpper aOperSobrenome;
    private DomUpper aOperCodigo;
    private DomLogin aUsuaLogin;
    
    // Query items
    
    @Override
    public String getBaseSql() {
        return "select BASE.*"
                + " , OPER.NOME_APRESENTACAO as NOME_APRESENTACAO"
                + " , OPER.NOME as OPER_NOME"
                + " , OPER.SOBRENOME as OPER_SOBRENOME"
                + " , OPER.CODIGO as OPER_CODIGO"
                + " , USUA.LOGIN as USUA_LOGIN"
                + " , OPER.ID as Z_OPER_ID"
                + " , USUA.ID as Z_USUA_ID"
                + " from OPERADOR_INSTRUMENTO BASE"
                + " join PESSOA OPER on OPER.ID = BASE.OPERADOR_INSTRUMENTO_ID"
                + " left join USUARIOS USUA on USUA.ID = OPER.USUARIO_ASSOCIADO_ID";
    }
    
    @Override
    public void initAttributes() {
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("Id");
        
        aInstrumentoEnsaioId = new DomId();
        aInstrumentoEnsaioId.context(ctx).name("INSTRUMENTO_ENSAIO_ID").label("Instrumento de ensaio");
        
        aOperadorInstrumentoId = new DomId();
        aOperadorInstrumentoId.context(ctx).name("OPERADOR_INSTRUMENTO_ID").label("Operador do instrumento");
        
        aNomeApresentacao = new DomUpper();
        aNomeApresentacao.context(ctx).name("NOME_APRESENTACAO").label("Nome completo da pessoa");
        aNomeApresentacao.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME_APRESENTACAO as valor"
                + " , NOME_APRESENTACAO as pesquisar"
                + " , NOME_APRESENTACAO as descricao"
                + " from PESSOA OPER"
                + " where oper.ativo = 'S'"
                + " and oper.usuario_associado_id in ( select usua.id from usuarios usua where usua.ativo = 'S'))", "q"));
        aNomeApresentacao.setAutocompleteLength(2);
        
        aOperNome = new DomUpper();
        aOperNome.context(ctx).name("OPER_NOME").label("Nome da pessoa");
        aOperNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PESSOA OPER"
                + " where oper.ativo = 'S'"
                + " and oper.usuario_associado_id in ( select usua.id from usuarios usua where usua.ativo = 'S'))", "q"));
        aOperNome.setAutocompleteLength(2);
        
        aOperSobrenome = new DomUpper();
        aOperSobrenome.context(ctx).name("OPER_SOBRENOME").label("Sobrenome da pessoa");
        aOperSobrenome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT SOBRENOME as valor"
                + " , SOBRENOME as pesquisar"
                + " , SOBRENOME as descricao"
                + " from PESSOA OPER"
                + " where oper.ativo = 'S'"
                + " and oper.usuario_associado_id in ( select usua.id from usuarios usua where usua.ativo = 'S'))", "q"));
        aOperSobrenome.setAutocompleteLength(2);
        
        aOperCodigo = new DomUpper();
        aOperCodigo.context(ctx).name("OPER_CODIGO").label("Código da pessoa");
        aOperCodigo.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT CODIGO as valor"
                + " , CODIGO as pesquisar"
                + " , CODIGO as descricao"
                + " from PESSOA OPER"
                + " where oper.ativo = 'S'"
                + " and oper.usuario_associado_id in ( select usua.id from usuarios usua where usua.ativo = 'S'))", "q"));
        aOperCodigo.setAutocompleteLength(2);
        
        aUsuaLogin = new DomLogin();
        aUsuaLogin.context(ctx).name("USUA_LOGIN").label("Usuário do sistema");
        aUsuaLogin.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT LOGIN as valor"
                + " , LOGIN as pesquisar"
                + " , LOGIN as descricao"
                + " from USUARIOS USUA"
                + " where usua.ativo = 'S')", "q"));
        aUsuaLogin.setAutocompleteLength(1);
        
    }
    
    @Override
    public void initParameters() {
        pIdInstrumentoEnsaio = new DomId(ctx, "ID_INSTRUMENTO_ENSAIO", "Instrumento de ensaio");
        pIdInstrumentoEnsaio.setValue(ctx.getParameter("P_ID_INSTRUMENTO_ENSAIO"));
        pIdInstrumentoEnsaio.setSqlExpression("INSTRUMENTO_ENSAIO_ID");
        if (pIdInstrumentoEnsaio.isNotNull()) {
            aInstrumentoEnsaioId.setValue(pIdInstrumentoEnsaio.getValue());
        }
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pIdInstrumentoEnsaio);
        }
        return allParameters;
    }
    
    @Override
    public void copyBindParameters() {
        EntOperadorInstrumento record = getRecord();
        if (pIdInstrumentoEnsaio.isNotNull()) {
            record.setInstrumentoEnsaioId(pIdInstrumentoEnsaio.getValue());
        }
    }
    
    @Override
    public void retrieveBindParameters() {
        pIdInstrumentoEnsaio.setValue(getRecord().valueOfInstrumentoEnsaioId());
    }
    
    @Override
    public String getQueryPkColumn() {
        return "BASE.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntOperadorInstrumento getRecord() {
        if (base == null) {
            base = new EntOperadorInstrumento(ctx);
            rec = base;
        }
        return this.base;
    }
    
    @Override
    public String getContextName() {
        return aNomeApresentacao.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "NOME_APRESENTACAO, OPER_CODIGO, USUA_LOGIN";
    }
    
    @Override
    public void translateInsertFks(Form form) {
        ModelQuery query;
        
        // OPERADOR_INSTRUMENTO_ID
        try {
            if (form.hasFields("NOME_APRESENTACAO")) {
                query = createQuery()
                        .select("OPER.ID")
                        .from("PESSOA", "OPER")
                        .where("oper.ativo = 'S'"
                        + " and oper.usuario_associado_id in ( select usua.id from usuarios usua where usua.ativo = 'S')")
                        .filter("OPER.NOME_APRESENTACAO", form.get("NOME_APRESENTACAO"))
                        ;
                base.setOperadorInstrumentoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    
    @Override
    public void translateUpdateFks(Form form) {
        ModelQuery query;
        
        // OPERADOR_INSTRUMENTO_ID
        try {
            if (form.hasFields("NOME_APRESENTACAO")) {
                query = createQuery()
                        .select("OPER.ID")
                        .from("PESSOA", "OPER")
                        .where("oper.ativo = 'S'"
                        + " and oper.usuario_associado_id in ( select usua.id from usuarios usua where usua.ativo = 'S')")
                        .filter("OPER.NOME_APRESENTACAO", form.get("NOME_APRESENTACAO"))
                        ;
                base.setOperadorInstrumentoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            addField(aNomeApresentacao, "view");
            addField(aOperCodigo, "view");
            addField(aUsuaLogin, "view");
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="VIEW">
    public class FView extends ViewFeature {
        
        @Override
        public void initForm() {
            addField(aNomeApresentacao, "view");
            addField(aOperNome, "view");
            addField(aOperSobrenome, "view");
            addField(aOperCodigo, "view");
            addField(aUsuaLogin, "view");
        }
        
        {
            setFeatureName("VIEW");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="INSERT">
    public class FInsert extends MultiRowInsertFeature {
        
        @Override
        public void initForm() {
            aNomeApresentacao.setOptional(false);
            addField(aNomeApresentacao, "rqd");
            aOperCodigo.setEditable(false);
            addField(aOperCodigo, "view");
            aUsuaLogin.setEditable(false);
            addField(aUsuaLogin, "view");
        }
        
        {
            setFeatureName("INSERT");
            setPrimary(false);
            setRows(10);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="UPDATE">
    public class FUpdate extends MultiRowUpdateFeature {
        
        @Override
        public void initForm() {
            aNomeApresentacao.setOptional(false);
            addField(aNomeApresentacao, "rqd");
            aOperNome.setEditable(false);
            addField(aOperNome, "view");
            aOperSobrenome.setEditable(false);
            addField(aOperSobrenome, "view");
            aOperCodigo.setEditable(false);
            addField(aOperCodigo, "view");
            aUsuaLogin.setOptional(false);
            addField(aUsuaLogin, "rqd");
        }
        
        {
            setFeatureName("UPDATE");
            setPrimary(false);
            setRows(10);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DELETE">
    public class FDelete extends DeleteFeature {
        
        @Override
        public void initForm() {
            addField(aNomeApresentacao, "view");
            addField(aOperCodigo, "view");
            addField(aUsuaLogin, "view");
        }
        
        {
            setFeatureName("DELETE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="NOME_APRESENTACAO_LOOKUP">
    public class FNomeApresentacaoLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aNomeApresentacao.setEditable(true);
            addField(aNomeApresentacao, "opt");
            aOperNome.setEditable(false);
            addField(aOperNome, "view");
            aOperSobrenome.setEditable(false);
            addField(aOperSobrenome, "view");
            aOperCodigo.setEditable(false);
            addField(aOperCodigo, "view");
            aUsuaLogin.setEditable(true);
            addField(aUsuaLogin, "opt");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("OPER.NOME_APRESENTACAO as NOME_APRESENTACAO")
                    .select("OPER.NOME as OPER_NOME")
                    .select("OPER.SOBRENOME as OPER_SOBRENOME")
                    .select("OPER.CODIGO as OPER_CODIGO")
                    .select("USUA.LOGIN as USUA_LOGIN")
                    .from("PESSOA", "OPER")
                    .leftJoin("USUARIOS", "USUA", "USUA.ID = OPER.USUARIO_ASSOCIADO_ID")
                    .where("oper.ativo = 'S'"
                    + " and oper.usuario_associado_id in ( select usua.id from usuarios usua where usua.ativo = 'S')")
                    ;
        }
        
        {
            setFeatureName("NOME_APRESENTACAO_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FList());
        addFeature(new FView());
        addFeature(new FInsert());
        addFeature(new FUpdate());
        addFeature(new FDelete());
        addFeature(new FNomeApresentacaoLookup());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "LIST";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public Long getInstrumentoEnsaioId() {
        return aInstrumentoEnsaioId.getValue();
    }
    
    public void setInstrumentoEnsaioId(Long value) {
        this.aInstrumentoEnsaioId.setValue(value);
    }
    
    public Long getOperadorInstrumentoId() {
        return aOperadorInstrumentoId.getValue();
    }
    
    public void setOperadorInstrumentoId(Long value) {
        this.aOperadorInstrumentoId.setValue(value);
    }
    
    public String getNomeApresentacao() {
        return aNomeApresentacao.getValue();
    }
    
    public void setNomeApresentacao(String value) {
        this.aNomeApresentacao.setValue(value);
    }
    
    public String getOperNome() {
        return aOperNome.getValue();
    }
    
    public void setOperNome(String value) {
        this.aOperNome.setValue(value);
    }
    
    public String getOperSobrenome() {
        return aOperSobrenome.getValue();
    }
    
    public void setOperSobrenome(String value) {
        this.aOperSobrenome.setValue(value);
    }
    
    public String getOperCodigo() {
        return aOperCodigo.getValue();
    }
    
    public void setOperCodigo(String value) {
        this.aOperCodigo.setValue(value);
    }
    
    public String getUsuaLogin() {
        return aUsuaLogin.getValue();
    }
    
    public void setUsuaLogin(String value) {
        this.aUsuaLogin.setValue(value);
    }
    
    public Long getParameterIdInstrumentoEnsaio() {
        return pIdInstrumentoEnsaio.getValue();
    }
    
    public void setParameterIdInstrumentoEnsaio(Long value) {
        pIdInstrumentoEnsaio.setValue(value);
        aInstrumentoEnsaioId.setValue(value);
    }
    // </editor-fold>
    
    
    @Override
    public String getJsServiceFile() {
        return "ui/ztest/cad_operador_instrumento.js";
    }
}
